package cn.tedu._05weibo.controller;

import cn.tedu._05weibo.common.response.JsonResult;
import cn.tedu._05weibo.common.response.StatusCode;
import cn.tedu._05weibo.mapper.UserMapper;
import cn.tedu._05weibo.pojo.dto.UserLoginDto;
import cn.tedu._05weibo.pojo.dto.UserRegDto;
import cn.tedu._05weibo.pojo.entity.User;
import cn.tedu._05weibo.pojo.vo.UserVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpSession;
import java.util.Date;

/**
 *1.Api注解：设置控制器类名在Knife4j文档中显示的名称;
 * 2.@ApiOperation注解
 * 添加在控制器类中处理请求的方法上的注解；
 * 用于配置此方法处理的请求在API文档中显示的文本。
 * 参数说明
 * value：配置业务名称
 * 3.@ApiIgnore用于表示API文档框架应该忽略此参数。
 *
 */
@Api(tags = "01.用户模块")
/**
 * @Slf4j注解
 * 1。日志注解，添加在类上
 * 2.在类上添加此注解后，会自动创建一个日志对象
 */
@Validated
@Slf4j
@RestController
@RequestMapping("/v1/users/")
public class UserController {
    @Autowired
    private UserMapper userMapper;
    /**
     * 1.注册功能
     * RequestBody注解：java对象----> json格式---->web前端
     * RequestBody注解：js对象----> json格式---->java服务端
     */
    @PostMapping("reg")
    @ApiOperation(value = "注册功能")
    public JsonResult userReg(@RequestBody @Validated UserRegDto userRegDto){
        log.debug("userRegDto"+userRegDto);
        /*
            1.接收参数【已完成】
            2.数据合法性校验【暂时不做，后续用验证框架做】
            3.校验用户名是否被占用【select接口】
                3.1被占用，return 2;
                3.2未被占用，【insert接口】，return 1;
         */
        //校验用户名是否被占用
        UserVo userVo = userMapper.selectByUsername(userRegDto.getUsername());
        if (userVo != null) {
            return new JsonResult(StatusCode.USERNAME_ALREADY_EXISTS);
        }
        //未被占用
        User user = new User();
        BeanUtils.copyProperties(userRegDto,user);
        user.setCreated(new Date());
        userMapper.insert(user);
        return JsonResult.ok();//注册成功
    }

    /**
     * 2.登录功能
     *
     */

    @PostMapping(value = "login")
    @ApiOperation(value = "登录功能")
    public JsonResult userLogin(@RequestBody UserLoginDto userLoginDto,@ApiIgnore HttpSession session){
        log.debug("userLoginDto = " + userLoginDto);
        /*
            1.根据用户名查询;
            2.未查到数据,用户名错误;
            3.查到了数据,比较密码是否正确;
         */
        UserVo userVo = userMapper.selectByUsername(userLoginDto.getUsername());
        if (userVo == null) {//用户名错误
            return new JsonResult(StatusCode.USERNAME_ERROR);
        }
        //比较密码
        if(userVo.getPassword().equals(userLoginDto.getPassword())){
            //设置唯一标识
            session.setAttribute("user",userVo);
            return new JsonResult(StatusCode.LOGIN_SUCCESS);//登录成功
        }
        return new JsonResult(StatusCode.PASSWORD_ERROR);//密码错误
    }
    /**
     * 3.获取当前用户功能
     */
    @GetMapping("currentUser")
    @ApiOperation(value = "获取当前用户功能")
    public JsonResult currentUser(@ApiIgnore HttpSession session){
        UserVo userVo = (UserVo) session.getAttribute("user");
        return JsonResult.ok(userVo);
    }
    /**
     * 4.退出登录
     */
    @GetMapping("logout")
    @ApiOperation(value = "退出登录功能")
    public void logout(@ApiIgnore HttpSession session){
        session.removeAttribute("user");
    }
}
